/**
 * 权限指令
 * 用法：
 * v-permission="'user:delete'"
 * v-permission="['user:delete', 'user:edit']"
 * v-permission="{ code: 'user:delete', type: 'button' }"
 * v-permission="{ codes: ['user:delete', 'user:edit'], mode: 'any' }"
 */

import type { App, DirectiveBinding } from 'vue';

import { useAccessStore } from '@vben/stores';

import { hasPermissionInToken } from '#/utils/token';

interface PermissionDirectiveValue {
  /** 单个权限编码 */
  code?: string;
  /** 多个权限编码 */
  codes?: string[];
  /** 权限类型 */
  type?: 'button' | 'menu' | 'url' | 'any';
  /** 匹配模式：'any' 表示拥有任一权限即可，'all' 表示必须拥有所有权限 */
  mode?: 'any' | 'all';
}

type PermissionValue = string | string[] | PermissionDirectiveValue;

/**
 * 检查权限（从 accessStore.accessCodes 中检查）
 */
function checkPermission(value: PermissionValue): boolean {
  const accessStore = useAccessStore();
  const accessCodes = accessStore.accessCodes || [];

  if (!accessStore.accessToken) {
    console.warn('[v-permission] 未找到 accessToken');
    return false;
  }

  // 字符串：单个权限编码
  if (typeof value === 'string') {
    const hasPermission = accessCodes.includes(value);

    // 调试日志
    if (!hasPermission && import.meta.env.DEV) {
      // 查找相似的权限码（可能是格式不一致）
      const similarPermissions = accessCodes.filter((code) =>
        code.toLowerCase().includes(value.toLowerCase()) ||
        value.toLowerCase().includes(code.toLowerCase())
      );

      console.warn(`[v-permission] 权限检查失败: "${value}"`, {
        检查的权限码: value,
        当前用户权限数量: accessCodes.length,
        当前用户权限列表: [...accessCodes],
        相似的权限码: similarPermissions.length > 0 ? similarPermissions : '未找到相似权限',
      });
    }

    return hasPermission;
  }

  // 数组：多个权限编码（默认 any 模式）
  if (Array.isArray(value)) {
    return value.some((code) => accessCodes.includes(code));
  }

  // 对象：详细配置
  if (typeof value === 'object') {
    const { code, codes, mode = 'any' } = value;

    // 单个权限编码
    if (code) {
      return accessCodes.includes(code);
    }

    // 多个权限编码
    if (codes && Array.isArray(codes)) {
      if (mode === 'all') {
        // 必须拥有所有权限
        return codes.every((c) => accessCodes.includes(c));
      } else {
        // 拥有任一权限即可
        return codes.some((c) => accessCodes.includes(c));
      }
    }
  }

  return false;
}

/**
 * 权限指令实现
 */
const permissionDirective = {
  mounted(el: HTMLElement, binding: DirectiveBinding<PermissionValue>) {
    const { value } = binding;

    if (!value) {
      console.warn('[v-permission] 缺少权限编码参数');
      return;
    }

    const hasPermission = checkPermission(value);

    if (!hasPermission) {
      // 没有权限：移除元素
      el.parentNode?.removeChild(el);
    }
  },

  updated(el: HTMLElement, binding: DirectiveBinding<PermissionValue>) {
    const { value, oldValue } = binding;

    // 值未变化，不处理
    if (JSON.stringify(value) === JSON.stringify(oldValue)) {
      return;
    }

    if (!value) {
      console.warn('[v-permission] 缺少权限编码参数');
      return;
    }

    const hasPermission = checkPermission(value);

    if (!hasPermission) {
      // 没有权限：移除元素
      if (el.parentNode) {
        el.parentNode.removeChild(el);
      }
    }
  },
};

/**
 * 注册权限指令
 */
export function setupPermissionDirective(app: App) {
  app.directive('permission', permissionDirective);
}

export default permissionDirective;

